package cn.iocoder.yudao.module.vote.service.userref;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.vote.controller.admin.voteuserinfo.vo.VoteUserImportRespVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import java.util.*;
import cn.iocoder.yudao.module.vote.controller.admin.userref.vo.*;
import cn.iocoder.yudao.module.vote.dal.dataobject.userref.VoteUserRefDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

import cn.iocoder.yudao.module.vote.convert.userref.VoteUserRefConvert;
import cn.iocoder.yudao.module.vote.dal.mysql.userref.VoteUserRefMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.vote.enums.ErrorCodeConstants.*;

/**
 * 用户投票规则关联 Service 实现类
 *
 * @author moving
 */
@Service
@Validated
public class VoteUserRefServiceImpl implements VoteUserRefService {

    @Resource
    private VoteUserRefMapper userRefMapper;

    @Resource
    private AdminUserApi adminUserApi;


    public List<VoteUserRefDO> getByVoteId(Integer voteId){
        return userRefMapper.getByVoteId(voteId);
    }

    @Override
    public VoteUserRefDO getByUserIdAndVoteId(Integer voteId,Long userId){
        return userRefMapper.getByUserIdAndVoteId(voteId,userId);
    }


    @Override
    public Long createUserRef(VoteUserRefCreateReqVO createReqVO) {
        // 插入
        VoteUserRefDO userRef = VoteUserRefConvert.INSTANCE.convert(createReqVO);
        userRefMapper.insert(userRef);
        // 返回
        return userRef.getId();
    }

    @Override
    public void updateUserRef(VoteUserRefUpdateReqVO updateReqVO) {
        // 校验存在
        this.validateUserRefExists(updateReqVO.getId());
        // 更新
        VoteUserRefDO updateObj = VoteUserRefConvert.INSTANCE.convert(updateReqVO);
        userRefMapper.updateById(updateObj);
    }

    @Override
    public void deleteUserRef(Long id) {
        // 校验存在
        this.validateUserRefExists(id);
        // 删除
        userRefMapper.deleteById(id);
    }

    private void validateUserRefExists(Long id) {
        if (userRefMapper.selectById(id) == null) {
            throw exception(USER_REF_NOT_EXISTS);
        }
    }

    @Override
    public VoteUserRefDO getUserRef(Long id) {
        return userRefMapper.selectById(id);
    }

    @Override
    public List<VoteUserRefDO> getUserRefList(Collection<Long> ids) {
        return userRefMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<VoteUserRefDO> getUserRefPage(VoteUserRefPageReqVO pageReqVO) {
        return userRefMapper.selectPage(pageReqVO);
    }

    @Override
    public List<VoteUserRefDO> getUserRefList(VoteUserRefExportReqVO exportReqVO) {
        return userRefMapper.selectList(exportReqVO);
    }

    @Override
    @Transactional
    public VoteUserRefImportRespVO importVoteUsers(List<VoteUserRefImportExcelVO>importUsers,Integer voteId, boolean isUpdateSupport){
        if (CollUtil.isEmpty(importUsers)) {
            throw exception(USER_IMPORT_LIST_IS_EMPTY);
        }
        VoteUserRefImportRespVO respVO = VoteUserRefImportRespVO.builder()
                .createUsernames(new ArrayList<>())
                .updateUsernames(new ArrayList<>())
                .failureUsernames(new LinkedHashMap<>()).build();

        importUsers.forEach(importUser -> {
            if (StrUtil.isBlank(importUser.getUserName()) || StrUtil.isBlank(importUser.getGroupName())) {
                respVO.getFailureUsernames().put("用户名，所属组","必填字段不能为空");
                return ;
            }
            // 用户是否存在
            AdminUserRespDTO adminUserRespDTO = adminUserApi.getByUsername(importUser.getUserName());
            // 判断如果不存在，在进行插入
            if (adminUserRespDTO == null) {
                respVO.getFailureUsernames().put("用户","不存在");
                return;
            }


            VoteUserRefDO existUser = userRefMapper.getByVoteIdAndUserName(voteId,importUser.getUserName());
            if(existUser==null){
                VoteUserRefDO refDO = VoteUserRefConvert.INSTANCE.convert(importUser);
                refDO.setUserId(adminUserRespDTO.getId());
                refDO.setNickName(adminUserRespDTO.getNickname());
                refDO.setVoteId(voteId.longValue());
                userRefMapper.insert(refDO);
                respVO.getCreateUsernames().add(importUser.getUserName());
                return;
            }

            // 如果存在，判断是否允许更新
            if (!isUpdateSupport) {
                respVO.getFailureUsernames().put(importUser.getUserName(), USER_INFO_EXISTS.getMsg());
                return;
            }
            VoteUserRefDO updateUser = VoteUserRefConvert.INSTANCE.convert(importUser);
            updateUser.setId(existUser.getId());
            updateUser.setUserId(adminUserRespDTO.getId());
            updateUser.setVoteId(voteId.longValue());
            updateUser.setNickName(adminUserRespDTO.getNickname());
            userRefMapper.updateById(updateUser);
            respVO.getUpdateUsernames().add(importUser.getUserName());
        });
        return respVO;
    }

}
